import {defineStore} from 'pinia'
import request from '@/uitils/request'
import {ApiRes} from '@/types/data'
import {CartItem} from '@/types/cart'
import useStore from '..'
const useCartStore=defineStore('cart',{
    // persist:true,
    persist:{key:'rabbit-cart-78'},
    state(){
        return{
            list:[] as CartItem[]
        }
    },
    actions:{
        // 加入购物车
         async joinCart(data:CartItem){
            //  有token
            if(this.isLogin){
                await request.post('/member/cart',{count:data.count,skuId:data.skuId})
                // 加入购物车时 重新获取数据
                this.getCartList()
            }else{
            // 没有token获取本地存储
            // 1.当sku在数组中 只用添加数量count
            // 2.当sku不在数组中，添加sku对象
            // console.log('获取本地')
            const goods=this.list.find(item=>item.skuId===data.skuId)
            if(goods){
                goods.count +=data.count
            }else{
                this.list.unshift(data)
            }
            }
         },
        //  获取购物车列表
       async getCartList(){
        if(this.isLogin){
            const res=await request.get<ApiRes<CartItem[]>>('/member/cart')
            // console.log(res.data);
             this.list=res.data.result
        }else{
         console.log('获取本地');
        }
        },
        // 删除购物车商品
       async delCart(skuId:String[]){
        if(this.isLogin){
            await request.delete('/member/cart',{
             data:{
             ids:skuId
            }
         })
            this.getCartList()
        }else{
            // 没有登录删除 数组过滤 item.skuId是否包含skuId
            this.list= this.list.filter(item=> !skuId.includes(item.skuId))
        }
        },
        // 修改购物车商品
       async updateCart(skuId:string,data:{selected?:boolean,count?:number}){
        if(this.isLogin){
            await   request.put(`/member/cart/${skuId}`,data)
            this.getCartList()
        }else{
            // 本地修改数据 
            const sku=this.list.find(item=>item.skuId===skuId)
            if(data.count){
               sku!.count= data.count 
            }
            if(data.selected!==undefined){
                sku!.selected=data.selected
            }
        }
        },
        // 商品全选状态
        async updateCartAllSelected(checked:boolean){
            if(this.isLogin){
                await request.put('/member/cart/selected',{selected:checked})
                this.getCartList()
            }else{
                // 点击全选 将状态赋值
                this.list.forEach(item=>item.selected=checked)
            }
        },
        // 清空购物车
        clearCart(){
            this.list=[]
        },
        // 合并购物车
      async  mergeCart(){
        const data=  this.list.map(item=>{
                return {
                 count:item.count,
                 selected:item.selected,
                 skuId:item.skuId
                }
            })
          await  request.post('/member/cart/merge',data)
          this.getCartList()
        }

    },
    getters:{
        // 判断是否登录
         isLogin():boolean{
            const {user}=useStore()
            // return Boolean(user.profile.token)类型转换
            return !!user.profile.token
         },

        // 有效商品
        effective():CartItem[]{
            return this.list.filter(item=>item.isEffective && item.stock)
        },
        // 有效商品总数量
        effectiveCount():number{
            return this.effective.reduce((sum,item)=>{
                return sum + item.count
            },0)
        },
        // 有效商品的总价格
        effectivePrice():string{
            return this.effective.reduce((sum,item)=> sum + item.count*+item.nowPrice,0).toFixed(2)
        },
        // 计算商品是否全部选中
        isAllSelected():boolean{
            return this.effective.length>0 && this.effective.every(item=>{
                return item.selected 
            })
        },
        // 已选择的列表
        selectedList():CartItem[]{
            return this.effective.filter(item=>item.selected)
        },
        // 已选择的商品总数
        selectedListCounts():number{
            return this.selectedList.reduce((sum,item)=>{
                return sum +item.count
            },0)
        },
        // 已选择的列表总价
        selectedListPrice():string{
            return this.selectedList.reduce((sum,item)=>{
                return sum +(+item.nowPrice)*item.count
            },0).toFixed(2)
        }
    }
})
export default useCartStore